package gui;

import gui.RootPanel;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import java.awt.event.ActionEvent;
import java.io.IOException;

import org.jdom.JDOMException;

import start.Config;
import start.Start;

/**
 * Das Rahmenwerk des Programmes. Das Grunddesign des Fensters mit
 * seinen Inhalten wird hier festgelegt.
 * @author Dominik Korittki, Dennis Wittkoetter, Dennis Oeguetveren
 */
public class DefaultWindow extends JFrame implements ActionListener {
	/** Serial Version ID */
	private static final long serialVersionUID = 1L;
	
	//Layout-Objekte
	/**Hauptmenue-Bereich: Datei*/
	private JMenu dateiMenu;
	/**Hauptmenue-Bereich: Bearbeiten*/
	private JMenu BearbeitenMenu;
	/**Hauptmenue-Bereich: Ansicht*/
	private JMenu ansichtMenu;
	/**Hauptmenue-Bereich: Hilfe*/
	private JMenu hilfeMenu;
	
	/**Datei-Menueeintrag: Zur Uebersicht springen*/
	private JMenuItem dateiUebersicht;
	/**Datei-Menueeintrag: Zu "Rezept hinzufuegen" springen*/
	private JMenuItem dateiHinzufuegen;
	/**Datei-Menueeintrag: Zur Suche springen*/
	private JMenuItem dateiSuche;
	/**Datei-Menueeintrag: Zu "Kategorien verwalten" springen*/
	private JMenuItem dateiKategorien;
	/**Datei-Menueeintrag: Programm beenden*/
	private JMenuItem dateiBeenden;
	
	/**Bearbeiten-Menueeintrag: Ausschneiden (obsolet)*/
	private JMenuItem bearbeitenAusschneiden;
	/**Bearbeten-Menueeintrag: Einfuegen (obsolet)*/
	private JMenuItem bearbeitenEinfuegen;
	
	/**Ansicht-Menueeintrag: Fenster vergroessern*/
	private JMenuItem ansichtVergroessern;
	/**Ansicht-Menueeintrag: Fenster normalisieren*/
	private JMenuItem ansichtNormal;
	/**Ansicht-Menueeintrag: Fenster minimieren*/
	private JMenuItem ansichtMinimieren;
	
	/**Hilfe-Menueeintrag: Handbuch anzeigen (obsolet)*/
	//private JMenuItem hilfeHandbuch;
	/**
	 * Hilfe-Menueeintrag zum Oeffnen des AboutWindow
	 * @see gui.AboutWindow
	 */
	private JMenuItem hilfeUeber;
	
	/**
	 * Speichert das RootPanel
	 * @see gui.RootPanel 
	 */
	private RootPanel rootPanel;
	

	/**
	 * Konstruktion des Default-Window
	 */
	public DefaultWindow() {
		super("eCookBook v1.0");
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			/* Look and Feel setzen und Fehler abfangen */
			public void run() {
				try {
					UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
				} catch (ClassNotFoundException e) {
					System.out.println("Kritischer Fehler: Konnte kein Look&Feel finden");
					if(Config.debugMode()) e.printStackTrace();
				} catch (InstantiationException e) {
					System.out.println("Kritischer Fehler: Konnte kein Look&Feel laden");
					if(Config.debugMode()) e.printStackTrace();
					System.exit(-1);
				} catch (IllegalAccessException e) {
					System.out.println("Kritischer Fehler: Konnte kein Look&Feel laden");
					if(Config.debugMode()) e.printStackTrace();
					System.exit(-1);
				} catch (UnsupportedLookAndFeelException e) {
					System.out.println("Kritischer Fehler: Look & Feel wird nicht unterstützt");
					if(Config.debugMode()) e.printStackTrace();
				};
			}
		});
	}
	
	/**
	 * Aufbau der GUI
	 * @throws IOException
	 * @throws JDOMException
	 */
	public void buildGUI() throws IOException, JDOMException {
		setIconImage(Start.getImgs().getWindowIcon());
		try {
			rootPanel = new RootPanel();
		} catch (IOException e1) {
			JOptionPane.showMessageDialog(Start.getDefWindow(), 
					"Konnte Dateien nicht laden. Schreib- und Leserechte gesetzt?", 
					"Allgemeiner Fehler", JOptionPane.ERROR_MESSAGE);
			if(Config.debugMode()) e1.printStackTrace();
		} catch (JDOMException e1) {
			JOptionPane.showMessageDialog(Start.getDefWindow(), 
					"Ein allgemeiner Fehler ist aufgetreten. Bitte suchen Sie nach Software Updates \n" +
					"oder kontaktieren Sie die Programmierer.", 
					"Allgemeiner Fehler", JOptionPane.ERROR_MESSAGE);
			if(Config.debugMode()) e1.printStackTrace();
		}
		JMenuBar menuBar = new JMenuBar();

		dateiMenu = new JMenu("Datei");
		BearbeitenMenu = new JMenu("Bearbeiten");
		ansichtMenu = new JMenu("Ansicht");
		hilfeMenu = new JMenu("Hilfe");
		
		dateiUebersicht = new JMenuItem("Übersicht");
		dateiHinzufuegen = new JMenuItem("Rezept hinzufügen");
		dateiSuche = new JMenuItem("Rezept suchen");
		dateiKategorien = new JMenuItem("Kategorien verwalten");
		dateiBeenden = new JMenuItem("Beenden");
		
		bearbeitenAusschneiden = new JMenuItem("Ausschneiden");
		bearbeitenEinfuegen = new JMenuItem("Einfügen");
		
		ansichtVergroessern = new JMenuItem("Vergrößern");
		ansichtNormal = new JMenuItem("Verkleinern");
		ansichtMinimieren = new JMenuItem("Minimieren");
		
		//hilfeHandbuch = new JMenuItem("Kurzhandbuch");
		hilfeUeber = new JMenuItem("Über eCookBook");
		
		
		dateiMenu.add(dateiUebersicht);
		dateiMenu.add(dateiHinzufuegen);
		dateiMenu.add(dateiSuche);
		dateiMenu.add(dateiKategorien);
		dateiMenu.add(dateiBeenden);
		menuBar.add(dateiMenu);
		
		BearbeitenMenu.add(bearbeitenAusschneiden);
		BearbeitenMenu.add(bearbeitenEinfuegen);
		//menuBar.add(BearbeitenMenu);	//Raus, weil ueberfluessig
		
		ansichtMenu.add(ansichtVergroessern);
		ansichtMenu.add(ansichtNormal);
		ansichtMenu.add(ansichtMinimieren);
		menuBar.add(ansichtMenu);
		
		//hilfeMenu.add(hilfeHandbuch);
		hilfeMenu.add(hilfeUeber);
		menuBar.add(hilfeMenu);

		setJMenuBar(menuBar);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Listener setzen
		dateiUebersicht.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				rootPanel.getTabbedPane().setSelectedIndex(0);
			}
		});
		dateiHinzufuegen.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				rootPanel.getTabbedPane().setSelectedIndex(1);
			}
		});
		dateiSuche.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				rootPanel.getTabbedPane().setSelectedIndex(2);
			}
		});
		dateiKategorien.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				rootPanel.getTabbedPane().setSelectedIndex(3);
			}
		});
		dateiBeenden.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		ansichtMinimieren.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				setExtendedState(JFrame.ICONIFIED);
			}
		});
		ansichtVergroessern.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				setExtendedState(JFrame.MAXIMIZED_BOTH);
			}
		});
		ansichtNormal.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				setExtendedState(JFrame.NORMAL);
			}
		});
		hilfeUeber.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent e) {
				displayAboutWindow();
			}
		});
		
		add(rootPanel, BorderLayout.CENTER);	//RootPanel hinzufuegen
		pack();
	}

	/**
	 * AboutWindow aufrufen
	 * @see gui.AboutWindow
	 */
	public void displayAboutWindow() {
		new AboutWindow(this);
	}

	/**
	 * Liefert das RootPanel
	 * @return	das rootPanel
	 * @see		gui.RootPanel
	 */
	public RootPanel getRootPanel() {
		return rootPanel;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}	
}
